找传奇、传世资源到传世资源站!
Java 正文

java awt swing 飞机躲子弹

8.5玩家评分(1人评分)
下载后可评
介绍 评论 失效链接反馈

from clipboard
from clipboardpackage com.plane.game;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JPanel;import java.awt.Color;import java.awt.Component;import java.awt.Container;import java.awt.Dimension;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.LayoutManager;import java.awt.Rectangle;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.ArrayList;import java.util.Date;import java.util.List;/** * * 这是游戏的主体类 继承JFrame类 * * 游戏运行环境JDK1.8.0_191 * * @author 高一桐 * */public class MainGame extends JFrame {/** * 定义一些变量 画布 飞机 子弹 * */Image bg = GameUtil.getImage("images/bg.jpg");Plane plane = new Plane("images/plane02.jpg", 108, 173);List bulletList = new ArrayList();// 计时功能Date starTime;Date endTime;Date countTime;// 子弹数int bulletNum = 10;// 1秒=1000毫秒,40毫秒表示一秒钟重画25次int gameSpeed = 400;public int getGameSpeed() {return gameSpeed;}public void setGameSpeed(int gameSpeed) {this.gameSpeed = gameSpeed;}// 游戏状态,游戏结束时 改为false;boolean gameState = true;/** * 加载游戏,画出窗口界面 */public void loadGame() {// 设置标题String titileString = "飞机 vs 子弹";setTitle(titileString);// 设置窗口尺寸setSize(700, 700);// 设置窗口出现横纵坐标setLocation(200, 20);// 设置背景色setBackground(new Color(1, 1, 1));// 禁止拉边框拉长拉断setResizable(false);// 添加菜单功能setJMenuBar(new GameMenuBar(this));//添加 Button 组合//setLocationRelativeTo(new ButtonComBox(this));// 启动重画线程new PaintThread().start();// 设置窗口可以关闭addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});// 设置窗口可见setVisible(true);}/** * 加载游戏,监听按键,创建子弹数量 */public void launchFrame() {loadGame();addKeyListener(new KeyMoniter());// 启动重画线程new PaintThread().start();// 集合里 放进去个子弹for (int i = 0; i < bulletNum; i ) {Bullet bullet = new Bullet();bulletList.add(bullet);}starTime = new Date();}/** * 往画布 上画 图像 */@Overridepublic void paint(Graphics g) {// 调用super.paint(g)去清除运动的痕迹super.paint(g);// 画 背景图g.drawImage(bg, 0, 0, null);// 发现 这个图像 一直在闪怎么解决使用缓冲技术就可以下边的方法就是// 画出来飞机,飞机画在背景上飞机的位置就确定了。plane.draw(g);// 更新飞机每次出现的时间countTime = new Date();// 然后把子弹放进去基本就可以了if (gameState) {for (int i = 0; i < bulletList.size(); i ) {Bullet b = (Bullet) bulletList.get(i);b.draw(g);// 循环判断 每一个子弹 是否 和 飞机 发生 重叠// 获取子弹的 范围Rectangle bulletRectangle = new Rectangle((int) b.x, (int) b.y, b.width, b.height);// 获取飞机的范围Rectangle planeRectangle = new Rectangle((int) plane.x, (int) plane.y, plane.width, plane.height);// 检测是否碰撞boolean collide = bulletRectangle.intersects(planeRectangle);// 如果中弹 就牺牲了。。。if (collide) {plane.setLive(false);endTime = new Date();gameState = false;}}}/** * 游戏中计时效果 */if (plane.isLive()) {int count_time = (int) (countTime.getTime() - starTime.getTime()) / 1000;printInfo(g, "游戏时间" count_time "秒", 20, 510, 50);}/** * 结束游戏 */if (!plane.isLive()) {printInfo(g, "游戏结束", 30, 160, 200);int survivalTime = (int) (endTime.getTime() - starTime.getTime()) / 1000;printInfo(g, "生存时间:" survivalTime "秒", 20, 220, 300);switch (survivalTime / 10) {case 0:printInfo(g, "你的游戏天赋 是 - ∞嘛", 30, 310, 400);break;case 1:printInfo(g, "你可以做的更好,加油!", 30, 310, 400);break;case 2:printInfo(g, "还不赖嘛!", 30, 310, 400);break;case 3:printInfo(g, "高手在哈工大啊!!!", 30, 310, 400);break;default:printInfo(g, "你已经超神了!!!", 30, 310, 400);}}}/** * 双缓冲技术,消除图像的闪烁 */Image ImageBuffer = null;Graphics GraImage = null;// 覆盖update方法,截取默认的调用过程public void update(Graphics g) {// 创建图形缓冲区ImageBuffer = createImage(this.getWidth(), this.getHeight());// 获取图形缓冲区的图形上下文GraImage = ImageBuffer.getGraphics();// 用paint方法中编写的绘图过程对图形缓冲区绘图paint(GraImage);// 释放图形上下文资源GraImage.dispose();// 将图形缓冲区绘制到屏幕上g.drawImage(ImageBuffer, 0, 0, this);}/** * 内部类,监听 飞机的按键 * * @author 高一桐 * */class KeyMoniter extends KeyAdapter {@Overridepublic void keyPressed(KeyEvent e) {plane.KeyPressedControlDirection(e);}@Overridepublic void keyReleased(KeyEvent e) {plane.KeyRelasedControlDirection(e);}}/** * 在屏幕上打印输出内容 * * @param g * @param message * @param size */public void printInfo(Graphics g, String message, int size, int x, int y) {g.setColor(Color.blue);Font f = new Font("楷书", Font.BOLD, size);g.setFont(f);g.drawString(message, x, y);}/** * 重画窗口的线程类,是一个内部类。 * * @author 高一桐 * */class PaintThread extends Thread {@Overridepublic void run() {while (true) {repaint();try {// 1秒=1000毫秒,40毫秒表示一秒钟重画25次Thread.sleep(gameSpeed);} catch (InterruptedException e) {e.printStackTrace();}}}}public static void newGame() {// 定义变量 便于重新开始MainGame game = new MainGame();// 加载游戏游戏开始game.launchFrame();}/** * 程序入口点 开始游戏 * * @param args */public static void main(String[] args) {// 开始 游戏newGame();}}

评论

发表评论必须先登陆, 您可以 登陆 或者 注册新账号 !


在线咨询: 问题反馈
客服QQ:174666394

有问题请留言,看到后及时答复